package gui;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.Toolkit;
import java.util.LinkedList;
import java.util.concurrent.BlockingQueue;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;

import model.BoxOffice;
import model.Client;

import kontroler.msg;

public class SimuFrame extends JFrame {
	
	/** serializacja. */
	private static final long serialVersionUID = 1L;

	/** Trzy glowne panele: górny (z wiadomosciami dla uzytkownika), srodkowy (okno symulacji) i dolny (panel uzytkownika z przyciskami).*/
	private JPanel upperPane, cashierPane, userPane; 
	
	/** kolejka do wysyłania informacji z widoku do kontrolera */
	 private static BlockingQueue<model.msg> queue = null;
	 
	 private static SimuFrame simuFrame = null;
	 
	 private BoxOffice[] kasysymulacji; 
	    private LinkedList<Client> PrzedKasami; 
	    private LinkedList<Client> ZaKasami; 
	    private int czas ;
	 
	 /** szerokosc ramki */
	 public static final int DEFAULT_WIDTH = 930;
	 /** wysokosc ramki */
	 public static final int DEFAULT_HEIGHT = 670;

	 public static SimuFrame init(BlockingQueue<model.msg> blockingQueue)
	    {
	        
		 if(simuFrame == null)
	        {    
	            queue = blockingQueue;
	            simuFrame = new SimuFrame();
	        }
	        return simuFrame;
	        
	    }
	 
	 /**
	 	 * Aktywuje grupe odpowiednich przyciskow, a dezaktywuje inne w zaleznosci od stanu symulacji. 
	 	 * @param mode Aktualny stan gry.
	 	 */
	 	public void setUserPanel(final SimuMode mode)
	 	{
	 		((UserPane) userPane).setUserPanel(mode);
	 	}
	 	
	 	/**
		  * Zmienia widok stolu z kartami na podstawie aktualnego stanu gry.
		  * @param model Informacje o modelu gry.
		  */
		 public void change(final model.msg simulInfo)
		 {
			 ((CashierPane) cashierPane).change(simulInfo);
		 }
		 
		 /**
		  * Wyświetla informacje dla uzytkownika na górnym panelu.
		  * @param message Wiadomość do wyswietlenia.
		  */
		 public void displayMessage(final String message)
		 {
			 ((UpperPane)upperPane).displayMessage(message);
		 }
		 
		 /** 
		* Zamyka ramkę.
		*/
			 public void close()
			 {
				 this.setVisible(false);
				 this.dispose();
			}
	 /** 
	    * Konstruktor SimuFrame.
	    * Prywatny - ponieważ może być tylko jedno wystąpienie klasy.
	    */
	    private SimuFrame()
	    {
	        //prywatne metody dla tego konstruktora
	        setFrameOnDisplay();
	        setPanels();
	        setVisible(true);
	        this.kasysymulacji = new BoxOffice[10];
	        for(int i =0; i<10; i++){
	        	kasysymulacji[i] = new BoxOffice();
	        }
	        this.PrzedKasami = new LinkedList();
	        this.ZaKasami = new LinkedList();
	        this.czas = 0;
	    }
	    
	    
	  /**
	   * Ustawienia podstawowe - opcje ramki na ekranie: tytuł, wielkosc, polozenie.
	   */
	  private void setFrameOnDisplay()
	    {
	    	// tytul ramki
	    	setTitle("Symulacja supermarketu");
	    	// ustawienie, zeby nie mozna bylo zmienic wielkosci ramki
	    	setResizable(false);
	    	
	    	 // sprawdza wymiary ekranu
	        Toolkit kit = Toolkit.getDefaultToolkit();
	        Dimension screenSize = kit.getScreenSize();
	        int screenHeight = screenSize.height;
	        int screenWidth = screenSize.width;

	        // ustawia szerokosc i wysokosc ramki
			setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);    
			
			 //ustawia polozenia ramki w centrum ekranu
	        setLocation((screenWidth-DEFAULT_WIDTH)/2, (screenHeight-DEFAULT_HEIGHT)/2);
	        setLocationRelativeTo(null);

	     // ustawia ikone
	        //ImageIcon imageIcon = new ImageIcon("images\\logo.png");
			//Image image = imageIcon.getImage();
	        //setIconImage(image);


			setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
	    }

	 /**
	  * Kladzie panele na ramce.
	  */
	 private void setPanels(){
		
		Container mainContainer = this.getContentPane(); 
		mainContainer.setLayout(new BorderLayout());
		
		// Dodanie górnego panelu z polem tekstowym z wiadomościami
		this.upperPane = new UpperPane();
		mainContainer.add(upperPane, BorderLayout.NORTH);
		
		
		
		// Dodanie środkowego panelu z symulacją marketu
		this.cashierPane = new CashierPane();
		mainContainer.add(cashierPane, BorderLayout.CENTER);
		
		// Dodanie dolnego panelu z przyciskami interaktywnymi użytkownika
		this.userPane = new UserPane(queue);
		mainContainer.add(userPane, BorderLayout.SOUTH);
		
	 }
	 
	
 
	  
}

